package com.example.dell.network.okgonet;


import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.text.TextUtils;
import android.util.Log;

import com.example.dell.basic.AppComplication;
import com.example.dell.utils.ToastUtils;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.AbsCallback;
import com.lzy.okgo.model.Response;
import com.lzy.okgo.request.base.Request;

import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.util.Map;

import me.jessyan.autosize.utils.LogUtils;


/**
 * Created by ccb on 2017/10/12.
 * 网络框架二次封装
 */

public class OkUtil {
    /**
     * @param url      请求的Uri
     * @param map      传递的键值对
     * @param callback 接口
     * @param <T>
     */
    public static <T> void getRequets(String url, Map<String, String> map, OkgoCallBack<T>  callback) {
        // TODO: 2017/10/13  加密 时间戳等 请求日志打印
        if (isConnected()) {
            OkGo.<T>get(url)
                    .params(map)
                    .execute(new AbsCallback<T>() {

                                 @Override
                                 public void onStart(Request<T, ? extends Request> request) {
                                     super.onStart(request);
                                     // 主要用于在所有请求之前添加公共的请求头或请求参数
                                     // 例如登录授权的 token
                                     // 使用的设备信息
                                     // 可以随意添加,也可以什么都不传
                                     // 还可以在这里对所有的参数进行加密，均在这里实现
                                     request.headers("header1", "HeaderValue1")
                                             .params("params1", "ParamsValue1")
                                             .params("token", "3215sdf13ad1f65asd4f3ads1f");
                                 }

                                 @Override
                                 public T convertResponse(okhttp3.Response response) throws Throwable {
                                     return null;
                                 }

                                 @Override
                                 public void onSuccess(Response<T> response) {
                                     callback.onSuccess(response);
                                 }

                                 @Override
                                 public void onError(Response<T> response) {
                                     super.onError(response);
                                     int code = response.code();
                                     if (code == 404) {
                                         ToastUtils.showToast("404 当前链接不存在");
                                         callback.onFailure("404 当前链接不存在",1);
                                         return;
                                     }
                                     Throwable exception = response.getException();

                                     if (exception instanceof SocketTimeoutException) {
                                         callback.onFailure("请求超时",1);
                                     } else if (exception instanceof SocketException) {
                                         callback.onFailure("服务器异常",1);
                                     } else if (exception instanceof MyException) { //个人自定义 异常 根据后台 约定值判断异常雷系
                                         String resultCode = ((MyException) exception).getErrorBean().getResultCode();
                                         //约定的身份表示过期
                                         if (TextUtils.equals(resultCode,"107")){
                                             //重登录
                                             callback.onFailure("服务器异常",2);
                                         }
                                     }
                                     callback.onFailure("未知错误",3);
                                 }


                             }
                    );
        } else {
            callback.onNetError();

        }
    }

    /**
     * @param url      请求的Uri
     * @param map      传递的键值对
     * @param callback 接口
     * @param <T>
     */
    public static <T> void postRequest(String url, Map<String, String> map, OkgoCallBack<T> callback) {
        if (isConnected()) {
            OkGo.<T>post(url)
                    .params(map)
                    .execute(new JsonCallback<T>() {
                        @Override
                        public void onSuccess(Response<T> response) {

                            System.out.println("获取的body是"+response.body());
                            callback.onSuccess(response);
                        }

                        @Override
                        public void onError(Response<T> response) {
                            super.onError(response);
                            int code = response.code();
                            if (code == 404) {
                                ToastUtils.showToast("404 当前链接不存在");
                                callback.onFailure("404 当前链接不存在",1);
                                return;
                            }
                            Throwable exception = response.getException();

                            if (exception instanceof SocketTimeoutException) {
                                callback.onFailure("请求超时",1);
                            } else if (exception instanceof SocketException) {
                                callback.onFailure("服务器异常",1);
                            } else if (exception instanceof MyException) { //个人自定义 异常 根据后台 约定值判断异常雷系
                                String resultCode = ((MyException) exception).getErrorBean().getResultCode();
                                //约定的身份表示过期
                                if (TextUtils.equals(resultCode,"107")){
                                    //重登录
                                    callback.onFailure("服务器异常",2);
                                }
                            }
                            callback.onFailure("未知错误",3);
                        }

                    });
        }else {

            callback.onNetError();
        }
    }

//    /**
//     *
//     * @param url
//     * @param map
//     * @param callback
//     * @param <T>
//     */
//    public static <T> void getRequets(String url, Map<String, String> map, JsonCallback<T> callback) {
//        // TODO: 2017/10/13  加密 时间戳等 请求日志打印
//        Log.d("OkGoUtil", "method get");
//        OkGo.<T>get(url)
//                .params(map)
//                .execute(callback);
//    }
//    public static <T> void postRequest(String url, Map<String, String> map, JsonCallback<T> callback) {
//        // TODO: 2017/10/13  加密 时间戳等 请求日志打印
//        Log.d("OkGoUtil", "method post");
//        OkGo.<T>post(url)
//                .params(map)
//                .execute(callback);
//    }



    /**
     * 是否有网络连接，不管是wifi还是数据流量
     *
     * @return
     */
    public static boolean isConnected() {
        ConnectivityManager cm = (ConnectivityManager) AppComplication.mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info == null) {
            return false;
        }
        boolean available = info.isAvailable();
        return available;
    }
}
